Перейти к основному содержимому

8.08. Векторная графика

Всем

Векторная графика

Общее определение и принципиальное отличие от растровой графики

Векторная графика — это способ представления изображений, при котором визуальное содержимое описывается не как набор цветных точек (пикселей), а как совокупность геометрических примитивов: точек, линий, отрезков, кривых, окружностей, многоугольников и других фигур, задаваемых аналитически — через координаты, параметры и правила построения. Ключевая особенность векторного представления заключается в его масштабируемости без потери качества: поскольку изображение описывается формально, а не фиксируется в разрешении, его можно отрисовать с любой степенью детализации, ограниченной лишь возможностями выводного устройства.

Это фундаментально отличает вектор от растра. Растровое изображение — это матрица значений, где каждое значение соответствует цвету конкретного пикселя на фиксированной сетке. При увеличении растрового изображения проявляется «пикселизация»: пиксели становятся видимыми, и детали теряются. Вектор же остаётся гладким, потому что при каждом новом рендеринге фигуры пересчитываются заново в соответствии с текущими параметрами отображения: разрешением экрана, масштабом, углом поворота и т.п.

Этот принцип лежит в основе большинства современных систем отображения графики: от шрифтов (например, OpenType с контурами в формате TrueType или CFF), до интерфейсов (SVG, PDF, UI-фреймворки), 2D/3D-движков и геоинформационных систем.


Понятие вектора в контексте компьютерной графики

В повседневной речи «вектор» часто ассоциируется с файлами .svg или схематичными иллюстрациями. Однако в теоретическом фундаменте графики термин вектор имеет строгое математическое значение — и при этом используется в нескольких смежных, но различимых смыслах.

Во-первых, вектор как элемент векторного пространства — это упорядоченный набор чисел, задающий величину и направление. В двумерной графике это пара чисел (x, y), в трёхмерной — тройка (x, y, z). Важно понимать, что вектор сам по себе не привязан к конкретной точке пространства: он описывает смещение. Например, вектор (3, 2) означает: «сдвинуться на 3 единицы по оси X и на 2 по оси Y», вне зависимости от того, откуда начинать движение.

Это различие критично для корректной интерпретации данных в графических системах. Точно так же, как в физике различают точку приложения силы и направление её действия, в графике различают:

  • точки (позиции) — абсолютные координаты в некоторой системе отсчёта;
  • векторы направления — указывают, куда смотрит объект, куда направлен луч света, как ориентирована поверхность;
  • нормали — частный случай векторов направления, которые перпендикулярны поверхности в данной точке и используются в расчётах освещения, коллизий и т.д.

Нормаль — единичный вектор (длина которого приведена к единице) с определённым знаком, задающим сторону поверхности: внешнюю или внутреннюю. Это позволяет алгоритмам различать, например, лицевую и тыльную сторону полигона — что особенно важно при визуализации (отбраковка невидимых граней, back-face culling) и при физических симуляциях.

Таким образом, в графических API (например, в WebGL, DirectX, Vulkan) типы данных часто явно разделяют точки и векторы, хотя на уровне памяти они могут храниться одинаково. Правильное семантическое различение предотвращает ошибки: например, попытку «перенести» направление (нормаль) как точку приведёт к искажению результатов освещения, поскольку нормали должны подвергаться только вращениям и отражениям, но не переносам.


Матрицы и трансформации

Если вектор — это величина с направлением, то матрица в графике — это оператор, который преобразует векторы. Любое геометрическое преобразование — перенос, поворот, масштабирование, сдвиг, отражение — может быть выражено как умножение вектора на матрицу подходящей размерности.

Самый распространённый тип — аффинные преобразования, которые сохраняют прямолинейность и параллельность линий. Они составляют основу практически всех 2D- и 3D-трансформаций в интерактивной графике.

Рассмотрим базовые виды:

  • Перенос (translation) — смещение всех точек на заданный вектор. В двумерном случае перенос на (tx, ty) требует трёхкомпонентного представления точки — отсюда возникает необходимость в однородных координатах, о чём будет сказано отдельно.

  • Масштабирование (scaling) — изменение размеров вдоль осей. Может быть равномерным (один коэффициент для всех осей) или неравномерным (разные коэффициенты по X, Y, Z). Отрицательный масштаб приводит к отражению (зеркальному отображению).

  • Поворот (rotation) — изменение ориентации вокруг заданной оси (в 3D) или точки (в 2D). Поворот сохраняет длину векторов и углы между ними (является ортогональным преобразованием). Последовательность поворотов вокруг разных осей не коммутативна: сначала поворот вокруг X, потом вокруг Y — не то же самое, что в обратном порядке. Это источник частых ошибок при анимации и управлении камерой.

Все эти преобразования можно комбинировать: умножая матрицы друг на друга, получаем результирующую матрицу, которая выполняет последовательность действий за один шаг. Например, чтобы повернуть объект вокруг своей локальной оси, а не вокруг начала координат, обычно выполняют:

  1. перенос объекта в начало координат,
  2. поворот,
  3. обратный перенос.
    Это эквивалентно одной составной матрице, и выполнение всех трёх шагов за один проход существенно повышает производительность.

Матрицы не хранят геометрию — они хранят инструкции по её изменению. Это делает их идеальными для иерархических систем: если у персонажа есть рука, а у руки — пальцы, то движение тела автоматически включает в себя трансформации всех его частей через цепочку умножений матриц.


Однородные координаты и проективная геометрия

Для того чтобы представить перенос как матричное умножение, необходимо ввести дополнительную размерность. Точка (x, y) в двумерном пространстве представляется как тройка (x, y, 1); вектор направления — как (vx, vy, 0). Такое расширение называется однородным представлением.

Основное преимущество: все аффинные преобразования, включая перенос, становятся представимыми в виде единообразного матричного умножения. Это позволяет объединить цепочку трансформаций (масштаб → поворот → перенос) в одну матрицу 3×3 (в 2D) или 4×4 (в 3D).

Ещё важнее то, что однородные координаты открывают путь к проективным преобразованиям — таким, которые моделируют перспективу. Перспективное искажение (например, схождение параллельных рельсов в точку на горизонте) нельзя выразить с помощью аффинных преобразований, но можно — с помощью проекционной матрицы, которая изменяет значение последней компоненты (w) и требует последующего деления:
реальная позиция = (x/w, y/w, z/w).

Таким образом, после всех трансформаций (модель → мир → вид → проекция) полученная точка находится в однородных клиппинг-координатах. Только после деления на w она переводится в нормализованные координаты устройства (NDC), а затем — в экранные пиксели. Эта последовательность — строгая математическая необходимость для корректной перспективы.

Использование w-компоненты также позволяет корректно обрабатывать точки на бесконечности (например, направления света, заданные как «бесконечно далёкие источники»): такие векторы имеют w = 0, и при перспективном делении остаются неизменными — что соответствует физическому смыслу «параллельных лучей».


Системы координат и цепочка преобразований

В трёхмерной графике редко бывает достаточно одной системы координат. Объекты моделируются в удобной для их создания локальной системе, затем интегрируются в общую сцену, из которой выделяется вид из камеры, и, наконец, проецируются на плоскость экрана. Эта последовательность называется графическим конвейером преобразований координат.

  1. Локальная (модельная) система координат — система, в которой задана сама геометрия: например, модель автомобиля может быть создана так, чтобы его центр масс находился в (0, 0, 0), а передняя ось совпадала с X. Все вершины меша хранятся относительно этого начала.

  2. Мировая система координат — единое пространство сцены, в котором располагаются все объекты. Матрица модель-мир определяет положение, ориентацию и масштаб объекта в мире. Именно в этой системе происходят расчёты физики, освещения (если источник глобальный), коллизий.

  3. Система координат вида (камеры) — пространство, «привязанное к глазу наблюдателя». Начало координат находится в точке расположения камеры, ось Z обычно направлена вглубь сцены (вперёд), X — вправо, Y — вверх. Матрица мир-вид (view matrix) инвертирует положение и ориентацию камеры: вместо того чтобы двигать камеру, мы двигаем всю сцену в противоположную сторону. Это математически эквивалентно и вычислительно эффективнее.

  4. Экранные (оконные) координаты — двумерные координаты в пикселях на устройстве вывода. Перед этим этапом происходит проецирование (перспективное или ортогональное) и отсечение невидимых частей (clipping). Важно: Z-координата не теряется — она сохраняется в буфере глубины (depth buffer) для правильного наложения объектов.

Понимание этой цепочки критично. Ошибка на любом этапе — например, применение освещения в локальных координатах или неправильное инвертирование view-матрицы — приводит к артефактам: «плавающим» объектам, искажённому освещению, разрывам в геометрии. Современные шейдеры (vertex shader, в частности) явно реализуют эту цепочку: вершинный шейдер принимает позицию в локальных координатах и возвращает однородные координаты после полного преобразования — это стандартный интерфейс, заложенный в API вроде OpenGL или Vulkan.


Геометрическое моделирование

Геометрическое моделирование — это область, посвящённая описанию и манипуляции формой объектов с помощью математических конструкций. В контексте векторной графики речь идёт о представлении формы, из которого изображение лишь выводится как один из возможных результатов. Это принципиально: модель может использоваться для визуализации и для расчётов — прочности, аэродинамики, маршрутизации, 3D-печати.

Существует несколько основных подходов к описанию геометрии. Каждый из них имеет свои компромиссы между точностью, компактностью, вычислительной сложностью и удобством редактирования.

Поверхности Безье

Поверхности Безье — один из самых ранних и интуитивно понятных способов параметрического описания гладких кривых и поверхностей. В основе лежит идея интерполяции между опорными точками (control points) с помощью полиномов Бернштейна.

Ключевая особенность: кривая не проходит через большинство опорных точек — они лишь «притягивают» форму, задавая её общую траекторию и натяжение. Лишь первая и последняя опорные точки лежат на кривой. Это делает поверхности Безье удобными для художественного моделирования (например, в Adobe Illustrator или в дизайне шрифтов), где важна управляемость формы, а не строгое соответствие точкам.

Однако у чистых поверхностей Безье есть существенный недостаток: увеличение числа опорных точек повышает степень полинома, что приводит к нестабильности — локальные изменения начинают влиять на всю кривую (глобальный контроль). Это неприемлемо для сложных моделей, где требуется точное редактирование отдельных участков.

B-сплайны и NURBS

Для преодоления ограничений Безье были разработаны B-сплайны (basis splines) — кусочно-полиномиальные функции, построенные из нескольких сегментов низкой степени, сшитых с заданной гладкостью (например, C¹ — непрерывная первая производная, C² — и вторая).

Главное преимущество B-сплайнов — локальный контроль: перемещение одной опорной точки влияет только на ограниченное число соседних сегментов, а не на всю кривую. Кроме того, степень полинома фиксируется независимо от числа опорных точек — можно иметь сотни опорных точек и при этом работать с квадратичными или кубическими полиномами.

NURBS (Non-Uniform Rational B-Splines) — дальнейшее обобщение B-сплайнов. Слово rational означает, что координаты точек вычисляются как отношение двух полиномов, а не как простой полином. Это позволяет точно представлять конические сечения — окружности, эллипсы, параболы, гиперболы, — чего нельзя сделать с помощью обычных (нерациональных) сплайнов. NURBS стали де-факто стандартом в CAD-системах (AutoCAD, SolidWorks, CATIA), аэрокосмической и автомобильной промышленности, где требуется соответствие строгим инженерным требованиям и совместимость между системами (например, через формат STEP, в котором геометрия часто хранится именно в виде NURBS).

NURBS — это математически строгий инструмент, обеспечивающий точное, однозначное, обратимое представление. Это критично для производства: если деталь спроектирована как NURBS-поверхность, станок с ЧПУ может рассчитать траекторию инструмента с заданной точностью — без дискретизации и потерь.

Полигональные сетки (meshes)

Несмотря на мощь сплайнов, подавляющее большинство интерактивных приложений (игры, VR, мобильная 3D-графика) используют полигональные сетки — приближённое представление поверхности в виде множества плоских многоугольников (чаще всего треугольников).

Причина проста: треугольники — это минимальная фигура, которую можно однозначно отрендерить на GPU. Все современные графические конвейеры оптимизированы под потоковый вывод треугольников. Плюс к этому, сетки легко поддаются оптимизации: упрощению, LOD (уровням детализации), физической симуляции (масс-спринг-системы), коллизиям (bounding volumes).

Однако сетка — всегда аппроксимация. Гладкость достигается за счёт увеличения числа полигонов или использования техник вроде сглаживания по нормалям (Phong shading), когда для каждой вершины хранится усреднённая нормаль, и интерполяция в шейдере создаёт иллюзию гладкой поверхности — хотя геометрия остаётся остроугольной.

Это приводит к необходимости постоянной работы с компромиссом «качество–производительность». Отсюда возникают три ключевые процедуры:

  • Упрощение (decimation, mesh reduction) — алгоритмы, уменьшающие число вершин и граней при сохранении визуальной формы. Примеры: алгоритм Квадратичной ошибки (QEM), edge collapse с контролем геометрического отклонения. Применяется для адаптации моделей под мобильные устройства или удалённую визуализацию.

  • Сглаживание (smoothing, fairing) — итеративное перемещение вершин для устранения шумов или «ступенчатости», возникающей при сканировании или автоматической триангуляции. Не следует путать с визуальным сглаживанием в шейдере: здесь меняется сама геометрия.

  • Ремешинг (remeshing) — полная или частичная перестройка топологии сетки: изменение распределения рёбер, улучшение соотношения сторон треугольников (avoiding slivers), выравнивание плотности. Это необходимо, когда исходная сетка имеет «плохие» треугольники (слишком острые или вытянутые), что приводит к ошибкам в физике, тесселяции или анимации (например, skinning на «плохой» сетке даёт артефакты).

Ремешинг особенно важен при подготовке моделей для анимации: в зонах сгиба (локти, колени) требуется более плотная и регулярная сетка, в то время как на плоских поверхностях (спина) можно использовать крупные полигоны.


ГИС и географические системы

В геоинформационных системах (ГИС) векторная графика играет центральную роль — в отличие, например, от спутниковых снимков (растровые данные), векторные слои хранят семантически насыщенную информацию о географических объектах.

В ГИС вектор — это геометрия, привязанная к геодезической системе отсчёта (например, WGS84 или ПЗ-90), и дополненная атрибутивными данными. Граница участка — это не polyline, а многоугольник с координатами в градусах/метрах, к которому прикреплены атрибуты: кадастровый номер, площадь, собственник, категория земли.

Типы векторных объектов в ГИС

  • Точки (point features) — объекты, размер которых несущественен в масштабе карты: скважины, вышки, геодезические пункты, адреса. Могут включать дополнительные параметры: высота (Z), время (T), точность измерения.

  • Линии (linestring, polyline) — линейные объекты: дороги, реки, трубопроводы, границы административных единиц. В продвинутых системах используются мультисегментные линии (MultiLineString) и ориентированные линии (с семантикой направления — например, одностороннее движение).

  • Полигоны (polygon) — замкнутые области: земельные участки, водоёмы, зоны застройки. Полигоны могут иметь внутренние «дыры» (например, участок с озером внутри). Топологически корректный полигон должен быть замкнутым, непересекающимся и иметь правильную ориентацию (обычно против часовой стрелки для внешнего контура).

Современные форматы (GeoJSON, GML, Shapefile) поддерживают эти типы, а также составные (multipart) геометрии. При этом обязательным является указание системы координат (CRS — Coordinate Reference System), поскольку одни и те же числа (например, 55, 37) могут означать совершенно разные места в зависимости от проекции.

Картография и проекции

Земля — трёхмерный эллипсоид, а карта — двумерна. Процесс перевода сфероидальных координат (широта, долгота, высота) в плоские (X, Y) называется картографической проекцией.

Ни одна проекция не может сохранить одновременно углы, площади, расстояния и формы — это следует из теоремы Гаусса о невозможности изометричного отображения сферы на плоскость. Поэтому выбирают проекцию, минимизирующую искажения для конкретной задачи:

  • Меркатор — сохраняет углы (конформна), удобен для навигации, но искажает площади (Гренландия кажется больше Африки).
  • Альбера — сохраняет площади (эквивалентна), используется в тематической картографии (плотность населения).
  • UTM (Universal Transverse Mercator) — поперечная цилиндрическая проекция, разбивает Землю на зоны по 6° долготы; в пределах зоны искажения минимальны — применяется в инженерных и кадастровых работах.

Векторная графика в ГИС всегда проходит этап проецирования перед отображением. При этом геометрия пересчитывается — координаты вершин линий и полигонов трансформируются в соответствии с формулами проекции. Это не просто «растяжка картинки»: это точное математическое преобразование, часто с коррекцией высоты, геоида и зоны UTM.

Векторизация

Векторизация — процесс преобразования растровых геоданных (сканы карт, снимки БПЛА, классифицированные изображения) в векторные объекты.

Это не всегда автоматизируемая задача. Простой пример: сканированная топокарта 1950-х годов — на ней леса обозначены штриховкой, дороги — линиями разной толщины, контуры — пунктиром. Автоматическая трассировка (например, через алгоритмы skeletonization или edge detection) даёт «сырой» вектор, который затем требует ручной чистки, топологической проверки и привязки к современной системе координат.

Современные подходы используют машинное обучение: сегментационные нейросети (U-Net, Mask R-CNN) выделяют объекты на растровом изображении, после чего выполняется полигонизация — построение замкнутых контуров с учётом гладкости и топологических правил (например, «дорога не может разрываться внутри населённого пункта»).

Векторизация критична для обновления кадастра, создания цифровых двойников городов, мониторинга изменений ландшафта. Особенно сложно векторизовать объекты с нечёткими границами — например, границу леса (ecotone), где переход идёт постепенно. В таких случаях прибегают к фаззи-геометрии или вероятностным полигонам — но это уже выходит за рамки классической векторной модели.